package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.Attributes;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    private GoodsTypeDao goodsTypeDao;

    /**
     * 加载节点列表
     * @return
     */
    @Override
    public String loadTypeList() {
        return getTypeListAll("-1").toString();
    }



    /**
     * 获取节点列表
     * @param pId
     * @return
     */
    @Override
    public JsonArray getTypeListAll(String pId) {

        //获取子节点列表 递归调用 会不断的获取子节点列表
        //这个 array 会不断的添加 子 array
        JsonArray array = getTypeListByPid(pId);

        //遍历最上层的所有节点 查看是否有子节点 如果有子节点 递归调用
        for(int i=0;i<array.size();i++){
            JsonObject node = (JsonObject) array.get(i);
            //如果当前节点没有子列表 直接看下一个节点 是否有分类列表
            if(node.get("state").getAsString().equals("open"))
                continue;
            //如果当前节点 有子节点列表 开始获取子节点列表
            else
                node.add("children",getTypeListAll(node.get("id").getAsString()));
        }

        //因为 方法调用方法 会返回方法调用处 所以会一直返回到最上层的 array 这个array 就包括了所有的子 array
        return array;
    }

    /**
     * 根据p_id 获取子分类列表
     * @param pId
     * @return
     */
    @Override
    public JsonArray getTypeListByPid(String pId) {

        //将获取的分类列表每一项 封装好节点数据以后 放到 nodeList 里面
        JsonArray nodeList = new JsonArray();

        //获取子分类列表
       List<GoodsType> goodsTypeList = goodsTypeDao.getTypeListByPid(pId);

       //遍历当前 list 完善节点数据
        for(GoodsType goodsType : goodsTypeList){
            JsonObject object = new JsonObject();
            object.addProperty("id",goodsType.getGoodsTypeId()); //封装节点id
            object.addProperty("text",goodsType.getGoodsTypeName());//封装节点名称
            object.addProperty("iconCls", "goods-type");// 节点图标
            String stateName = goodsType.getGoodsTypeState() == 1 ? "closed":"open";
            object.addProperty("state",stateName);
            //封装 attr 对象
            JsonObject attr = new JsonObject();
            attr.addProperty("state",goodsType.getGoodsTypeState());
            //至此 节点数据封装完毕
            object.add("attributes",attr);
            //输出封装好的对象
            System.out.println(object.toString());
            //当节点数据 封装好以后 将数据添加到 JsonArray 中
            nodeList.add(object);
        }


        return nodeList;
    }


    /**
     * 添加商品分类
     * @param goodsTypeName
     * @param pId
     * @return
     */
    @Override
    public int save(String goodsTypeName, Integer pId) {

        //创建实体类对象 方便获取新增以后的节点的id
        GoodsType goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setPId(pId);
        //添加商品分类 默认为叶子节点
        int save = goodsTypeDao.save(goodsType);

        //获取当前分类id  因为mapper 是主键自增
        Integer goodsTypeId = goodsType.getPId();

        //如果父节点是叶子节点 需要改成 非叶子节点
        goodsType= getGoodsTypeInfo(goodsTypeId.toString());
        if(goodsType.getGoodsTypeState() == 0){
            goodsTypeDao.updateGoodsTypeStateId(goodsType.getGoodsTypeId(),1);
        }
        return save;
    }

    /**
     * 获取商品分类详情
     * @param goodsTypeId
     * @return
     */
    @Override
    public GoodsType getGoodsTypeInfo(String goodsTypeId) {
        return goodsTypeDao.getGoodsTypeInfo(goodsTypeId);
    }

    /**
     * 删除完节点以后 要判断父节点下还有没有子分类列表
     * 如果没有子分类列表 那么应该变成叶子节点
     * @param goodsTypeId
     * @return
     */
    @Override
    public int deleteByPId(String goodsTypeId) {
        //获取父节点 id
        GoodsType goodsTypeInfo = goodsTypeDao.getGoodsTypeInfo(goodsTypeId);
        int row = goodsTypeDao.deleteByPId(goodsTypeId);
        //根据父节点 id 查看子分类列表
        JsonArray array = getTypeListByPid(goodsTypeInfo.getPId().toString());
        if(array.size() == 0)
            goodsTypeDao.updateGoodsTypeStateId(goodsTypeInfo.getPId().toString(),0);
        return row;
    }


}
